package myarry;

/**
 * @author lizy4
 * @date 2021/6/26 11:14
 */
public class MyArray {
    private int[] array;
    private int size;

    public MyArray(int capacity) {
        this.array = new int[capacity];
        this.size = 0;
    }

    /**
     * 插入
     *
     * @param index   指数
     * @param element 元素
     * @throws Exception 异常
     */
    public void insert(int index, int element) throws Exception{
        // 判断访问下标是否超出范围
        if (index<0 || index>size){
            throw new IndexOutOfBoundsException("超出数组实际元素范围！");
        }
        // 如果实际元素达到数组容量上限，则对数组进行扩容
        if (size >= array.length){
            resize();
        }
        // 从右向左循环，将元素逐个向右挪一位
        for (int i= size-1; i>=index ; i--){
            array[i+1]= array[i];
        }
        // 腾出的位置放入新元素
        array[index] = element;
        size++;
    }

    /**
     * 删除
     *
     * @param index 删除元素的位置
     * @return int
     * @throws Exception 异常
     */
    public int delete(int index) throws Exception{
        // 判断访问下标是否超出范围
        if (index < 0 || index >= size){
            throw new IndexOutOfBoundsException("超出数组实际元素范围！");
        }
        int deletedElement = array[index];
        // 从左向右循环，将元素逐个向左挪一位
        for (int i= index; i< size-1; i++){
            array[i]= array[i+1];
        }
        size--;
        return deletedElement;
    }

    /**
     * 扩容
     */
    private void resize() {
        int[] arrayNew = new int[array.length*2];
        // 从旧数组复制到新数组
        System.arraycopy(array,0,arrayNew,0,array.length);
        array = arrayNew;
    }

}
